PÔhjalik juhend JavaScripti Temporal API kasutamiseks tÀpsete ja intuitiivsete ajaintervallide arvutuste tegemiseks, hÔlmates kÔike alates kestuse loomisest kuni keeruka aritmeetika ja vormindamiseni.
JavaScript Temporal Duration: Ajaintervallide Arvutuste Meisterlik Valdamine
JavaScripti Temporal API tutvustab kaasaegset ja vÔimsat viisi kuupÀevade, kellaaegade ja ajaintervallide kÀsitlemiseks. Temporal.Duration
objekt esindab ajapikkust, pakkudes selget ja intuitiivset lĂ€henemist ajaintervallidega arvutuste tegemiseks. See artikkel sĂŒveneb Temporal.Duration
'i ĂŒksikasjadesse, nĂ€idates, kuidas luua, manipuleerida ja vormindada kestusi erinevate kasutusjuhtude jaoks.
Mis on Temporal.Duration?
Temporal.Duration
esindab ajavahemikku, vÀljendades seda aastates, kuudes, pÀevades, tundides, minutites, sekundites ja sekundi murdosades (millisekundid, mikrosekundid, nanosekundid). Erinevalt Date
objektidest, mis esindavad kindlat ajahetke, esindab Temporal.Duration
ajahulka. See jÀrgib ISO 8601 kestuse vormingut (nt P1Y2M10DT2H30M
tÀhendab 1 aastat, 2 kuud, 10 pÀeva, 2 tundi ja 30 minutit). Temporal API on loodud olema intuitiivsem ja vÀhem vigadealdis kui pÀrandobjekt Date
.
Temporal.Duration Objektide Loomine
Temporal.Duration
objekte saab luua mitmel viisil:
1. Lihtobjektist
Kestuse saate luua, edastades objekti soovitud omadustega:
const duration = new Temporal.Duration(1, 2, 10, 2, 30, 0, 0, 0);
console.log(duration.toString()); // VĂ€ljund: P1Y2M10DT2H30M
See loob kestuse 1 aasta, 2 kuud, 10 pÀeva, 2 tundi ja 30 minutit. Pange tÀhele, et argumendid vastavad jÀrgmisele jÀrjekorrale: aastad
, kuud
, nÀdalad
, pÀevad
, tunnid
, minutid
, sekundid
, millisekundid
, mikrosekundid
, nanosekundid
.
2. ISO 8601 SÔnest
Samuti saate luua kestuse ISO 8601 kestuse sÔnest, kasutades Temporal.Duration.from()
:
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
console.log(duration.toString()); // VĂ€ljund: P1Y2M10DT2H30M
See on eriti kasulik, kui tegelete kestustega, mis on salvestatud sÔne vormingus vÔi saadud vÀlisest allikast.
3. Kasutades meetodeid add()
ja subtract()
koos Temporal.Instant
, Temporal.ZonedDateTime
jne.
Kui liidate vÔi lahutate Temporal.Duration
teistest Temporal tĂŒĂŒpidest (nagu Temporal.Instant
vÔi Temporal.ZonedDateTime
), tagastatakse Temporal.Duration
, mis esindab nende kahe ajahetke vahet, kui te need seejÀrel lahutate. NÀiteks:
const now = Temporal.Now.zonedDateTimeISO();
const later = now.add({ hours: 5 });
const duration = later.since(now);
console.log(duration.toString()); // VĂ€ljund: PT5H
Kestuse Komponentidele JuurdepÀÀs
Temporal.Duration
objekti ĂŒksikutele komponentidele pÀÀseb juurde selle omaduste kaudu:
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
console.log(duration.years); // VĂ€ljund: 1
console.log(duration.months); // VĂ€ljund: 2
console.log(duration.days); // VĂ€ljund: 10
console.log(duration.hours); // VĂ€ljund: 2
console.log(duration.minutes); // VĂ€ljund: 30
console.log(duration.seconds); // VĂ€ljund: 0
console.log(duration.milliseconds); // VĂ€ljund: 0
console.log(duration.microseconds); // VĂ€ljund: 0
console.log(duration.nanoseconds); // VĂ€ljund: 0
Aritmeetika Teostamine Kestustega
Temporal.Duration
objektid toetavad liitmist ja lahutamist, kasutades meetodeid add()
ja subtract()
. Need meetodid tagastavad uue Temporal.Duration
objekti, mis esindab tehte tulemust.
const duration1 = Temporal.Duration.from("P1Y2M");
const duration2 = Temporal.Duration.from("P3M4D");
const addedDuration = duration1.add(duration2);
console.log(addedDuration.toString()); // VĂ€ljund: P1Y5M4D
const subtractedDuration = duration1.subtract(duration2);
console.log(subtractedDuration.toString()); // VĂ€ljund: P10M26D
Keerukamate arvutuste tegemiseks saate neid meetodeid ka aheldada:
const duration = Temporal.Duration.from("P1D").add({ hours: 12 }).subtract({ minutes: 30 });
console.log(duration.toString()); // VĂ€ljund: P1DT11H30M
Meetod negated()
tagastab uue Temporal.Duration
objekti, mille kÔik komponendid on vastandmÀrgiga:
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const negatedDuration = duration.negated();
console.log(negatedDuration.toString()); // VĂ€ljund: -P1Y2M10DT2H30M
Meetod abs()
tagastab uue Temporal.Duration
objekti, mille kÔik komponendid on positiivsete vÀÀrtustega (absoluutvÀÀrtused):
const duration = Temporal.Duration.from("-P1Y2M10DT2H30M");
const absoluteDuration = duration.abs();
console.log(absoluteDuration.toString()); // VĂ€ljund: P1Y2M10DT2H30M
Meetod with()
vÔimaldab teil luua uue Temporal.Duration
eksemplari, mille mÔned vÔi kÔik omadused on muudetud uutele vÀÀrtustele. Kui argumendi objektis vÀÀrtust ei mÀÀrata, kasutatakse kestuse algset vÀÀrtust. NÀiteks:
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const newDuration = duration.with({ years: 2, days: 5 });
console.log(newDuration.toString()); // VĂ€ljund: P2Y2M5DT2H30M
Kestuste Normaliseerimine
Kestusi saab mÔnikord vÀljendada normaliseerimata kujul (nt P1Y12M
, mida saaks lihtsustada kujule P2Y
). Meetod normalized()
ĂŒritab kestust lihtsustada selle kĂ”ige kompaktsemale kujule. Kuid see nĂ”uab vĂ”rdluskuupĂ€eva, et tulla toime erinevate kuude pikkuste keerukusega. Korralikuks normaliseerimiseks vajate Temporal.PlainDate
, Temporal.ZonedDateTime
vÔi Temporal.Instant
eksemplari.
NÀiteks kuud ja pÀevi sisaldava kestuse normaliseerimine nÔuab vÔrdluskuupÀeva:
const duration = Temporal.Duration.from("P1M32D");
const referenceDate = Temporal.PlainDate.from("2024-01-01");
const normalizedDuration = duration.normalized({ relativeTo: referenceDate });
console.log(normalizedDuration.toString()); // VĂ€ljund: P2M1D
Selles nÀites on kestus P1M32D
normaliseeritud 1. jaanuari 2024 suhtes, mille tulemuseks on P2M1D
, kuna jaanuaris on 31 pÀeva.
Kui tegelete ainult aja komponentidega (tunnid, minutid, sekundid jne), saate normaliseerida ilma vÔrdluskuupÀevata:
const duration = Temporal.Duration.from("PT25H61M");
const normalizedDuration = duration.normalized({ relativeTo: null }); //vÔi jÀtke relativeTo argument Àra
console.log(normalizedDuration.toString()); // VĂ€ljund: P1DT2H1M
Kestuste VÔrdlemine
Kestusi saate vÔrrelda meetodiga compare()
. See meetod tagastab:
- -1, kui esimene kestus on lĂŒhem kui teine kestus.
- 0, kui kestused on vÔrdsed.
- 1, kui esimene kestus on pikem kui teine kestus.
const duration1 = Temporal.Duration.from("P1Y");
const duration2 = Temporal.Duration.from("P6M");
const comparisonResult = Temporal.Duration.compare(duration1, duration2);
console.log(comparisonResult); // VĂ€ljund: 1
Praktilised NĂ€ited
1. SĂŒndmuseni JÀÀnud Aja Arvutamine
Oletame, et soovite arvutada konkreetse sĂŒndmuseni jÀÀnud aega. Kasutades praeguse aja saamiseks Temporal.Now.zonedDateTimeISO()
ja lahutades sĂŒndmuse kuupĂ€eva. Kui sĂŒndmuse kuupĂ€ev on möödas, on vĂ€ljund negatiivne.
const eventDate = Temporal.ZonedDateTime.from({ timeZone: 'America/Los_Angeles', year: 2024, month: 12, day: 25, hour: 9, minute: 0, second: 0 });
const now = Temporal.Now.zonedDateTimeISO('America/Los_Angeles');
const durationUntilEvent = eventDate.since(now);
console.log(durationUntilEvent.toString()); // VÀljund: nt P262DT14H30M (sÔltuvalt praegusest kuupÀevast ja kellaajast)
2. Projekti Ălesannete Kestuste JĂ€lgimine
Projektijuhtimises saate kasutada Temporal.Duration
'i ĂŒlesannete hinnangulise vĂ”i tegeliku kestuse jĂ€lgimiseks.
const task1EstimatedDuration = Temporal.Duration.from("PT8H"); // 8 tundi
const task2EstimatedDuration = Temporal.Duration.from("PT16H"); // 16 tundi
const totalEstimatedDuration = task1EstimatedDuration.add(task2EstimatedDuration);
console.log(`Hinnanguline kogukestus: ${totalEstimatedDuration.toString()}`); // VĂ€ljund: Hinnanguline kogukestus: P1DT
3. Vanuse Arvutamine
Kuigi vanuse tÀpne arvutamine nÔuab liigaastate ja ajavööndite arvessevÔtmist, vÔib Temporal.Duration
anda mÔistliku hinnangu:
const birthDate = Temporal.PlainDate.from("1990-05-15");
const currentDate = Temporal.PlainDate.from("2024-01-20");
const ageDuration = currentDate.since(birthDate, { smallestUnit: 'years' });
console.log(`Hinnanguline vanus: ${ageDuration.years} aastat`); // VĂ€ljund: Hinnanguline vanus: 33 aastat
4. Inimloetavate Kestuste Kuvamine
Sageli peate kuvama kestusi inimloetavas vormingus. Kuigi Temporal.Duration
'il pole sisseehitatud vormindamisfunktsioone, saate luua kohandatud vormindamisloogika:
function formatDuration(duration) {
const parts = [];
if (duration.years) parts.push(`${duration.years} aasta${duration.years > 1 ? 't' : ''}`);
if (duration.months) parts.push(`${duration.months} kuu${duration.months > 1 ? 'd' : ''}`);
if (duration.days) parts.push(`${duration.days} pÀev${duration.days > 1 ? 'a' : ''}`);
if (duration.hours) parts.push(`${duration.hours} tund${duration.hours > 1 ? 'i' : ''}`);
if (duration.minutes) parts.push(`${duration.minutes} minut${duration.minutes > 1 ? 'it' : ''}`);
if (duration.seconds) parts.push(`${duration.seconds} sekund${duration.seconds > 1 ? 'it' : ''}`);
return parts.join(', ');
}
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const formattedDuration = formatDuration(duration);
console.log(formattedDuration); // VÀljund: 1 aasta, 2 kuud, 10 pÀeva, 2 tundi, 30 minutit
TĂ€psem Kasutus ja Kaalutlused
1. Ajavööndite KÀsitlemine
Kui tegelete ajaintervallidega, mis ĂŒletavad ajavööndi piire vĂ”i suveaja ĂŒleminekuid, on tĂ€psete arvutuste tagamiseks ĂŒlioluline kasutada Temporal.ZonedDateTime
'i. Temporal.PlainDate
'i ja Temporal.PlainTime
'i kasutamine vÀldib ajavööndite teisendusi.
2. VĂ€him Ăhik ja Ămardamine
Meetodid `since()` ja `until()` aktsepteerivad sageli valikuid tulemuseks oleva kestuse vĂ€hima ĂŒhiku mÀÀramiseks. NĂ€iteks sĂŒndmuseni jÀÀnud aja arvutamine ja tulemuste piiramine pĂ€evadeni.
const eventDate = Temporal.PlainDate.from("2024-12-25");
const now = Temporal.PlainDate.from("2024-01-20");
const durationUntilEvent = now.until(eventDate, { smallestUnit: 'days' });
console.log(durationUntilEvent.toString()); //nÀidisvÀljund PT340D
3. Liigsekundid
Temporal ei arvesta liigsekundeid loomupÀraselt. Kui vajate ÀÀrmist tÀpsust, peate liigsekundeid eraldi kÀsitlema.
4. IANA Ajavööndid
Temporal API tugineb IANA (Internet Assigned Numbers Authority) ajavööndite andmebaasile. Veenduge, et teie keskkonnas oleks ajakohane IANA andmebaasi versioon, et ajavööndite teisendusi tÀpselt kÀsitleda.
Parimad Praktikad
- Kasutage kestuse sÔnede jaoks ISO 8601 vormingut: See tagab jÀrjepidevuse ja koostalitlusvÔime.
- Valige sobiv Temporal tĂŒĂŒp: Kasutage
Temporal.PlainDate
,Temporal.PlainTime
,Temporal.ZonedDateTime
vÔiTemporal.Instant
sÔltuvalt sellest, kas vajate ajavööndi tuge vÔi mitte. - Vajadusel normaliseerige kestused: Normaliseerimine lihtsustab kestusi ja muudab nende vÔrdlemise lihtsamaks.
- KÀsitsege ajavööndeid hoolikalt: Ajavööndite teisendused vÔivad olla keerulised, seega kasutage
Temporal.ZonedDateTime
'i ja olge teadlik suveaja ĂŒleminekutest. - Arvestage vĂ€hima ĂŒhikuga: Kestuste arvutamisel mÀÀrake vĂ€him ĂŒhik soovitud tĂ€psustaseme saavutamiseks.
- Kirjutage ĂŒhikteste: Testige oma koodi pĂ”hjalikult, et tagada kestuse arvutuste tĂ€psus.
Levinud LÔksud
- Ajavööndite ignoreerimine: Ajavööndite arvesse vĂ”tmata jĂ€tmine vĂ”ib pĂ”hjustada valesid kestuse arvutusi, eriti kui tegemist on sĂŒndmustega erinevates asukohtades.
- PĂ€randobjekti Date kasutamine: PĂ€randobjekt
Date
on tuntud oma veidruste ja ebajÀrjekindluse poolest. Eelistage usaldusvÀÀrsemaks kuupÀeva ja kellaaja kÀsitlemiseks Temporal API-d. - Kestuste normaliseerimata jÀtmine: Kestuste normaliseerimata jÀtmine vÔib muuta vÔrdlused ja arvutused keerukamaks.
- Vale ISO 8601 vorming: Kehtetu ISO 8601 kestuse sÔne kasutamine vÔib pÔhjustada vigu.
Reaalse Maailma Kasutusjuhud Erinevates Kultuurides
Temporal API vĂ”ib olla eriti kasulik globaalsetes rakendustes, kus ajavööndite erinevused ja kultuurilised nĂŒansid on olulised. Siin on mĂ”ned nĂ€ited:
- Ălemaailmne SĂŒndmuste Planeerimine: SĂŒndmuste tĂ€pne planeerimine mitmes ajavööndis, vĂ”ttes arvesse suveaja ĂŒleminekuid. NĂ€iteks veebiseminari planeerimine, mis algab kell 9:00 PST ja vastava algusaja kuvamine erinevates ajavööndites nagu CET, JST ja AEDT.
- Rahvusvaheline Reisiplaneerimine: Reisi kestuste arvutamine, sealhulgas vahemaandumised ja ajavööndi muutused. See on kasulik marsruutide koostamiseks ja lennugraafikute haldamiseks. NÀiteks kogu reisiaja arvutamine New Yorgist Tokyosse, sealhulgas vahemaandumine Londonis ja ajavööndi erinevuste arvestamine.
- Ălemaailmne E-kaubandus: Hinnanguliste tarneaegade kuvamine kasutaja kohalikus ajavööndis. See nĂ”uab lĂ€htekoha ajavööndi, tarne kestuse ja sihtkoha ajavööndi arvessevĂ”tmist. NĂ€iteks Saksamaa laost Austraalia kliendile saadetud kaup, mille hinnanguline tarneaeg on 7 pĂ€eva, kuvatakse kliendi kohalikus ajas.
- PiiriĂŒlesed Finantstehingud: Intresside kogunemise vĂ”i maksetĂ€htaegade tĂ€pne arvutamine erinevates piirkondades. See hĂ”lmab sageli erinevate tööpĂ€evade ja pĂŒhade arvestamist igas riigis. NĂ€iteks Singapuris laenult kogunenud intresside arvutamine, vĂ”ttes arvesse Singapuri riigipĂŒhi.
- Multikultuursed Kalendrirakendused: Erinevate kalendrisĂŒsteemide, nĂ€iteks islami vĂ”i heebrea kalendri, toetamine ning sĂŒndmuste kestuste ja meeldetuletuste tĂ€pne arvutamine nende kalendrite pĂ”hjal.
- Ălemaailmne Projektijuhtimine: Projekti ĂŒlesannete kestuste ja tĂ€htaegade jĂ€lgimine hajutatud meeskondades, vĂ”ttes arvesse erinevaid töögraafikuid ja ajavööndeid.
KokkuvÔte
Temporal.Duration
pakub robustset ja intuitiivset viisi ajaintervallidega töötamiseks JavaScriptis. MÔistes selle funktsioone ja parimaid praktikaid, saate oma rakendustes enesekindlalt teostada tÀpseid ja usaldusvÀÀrseid kestuse arvutusi. Temporal API omaksvÔtmine viib puhtama, paremini hooldatava koodini ja vÀhendab pÀrandkuupÀevade ja -aegade kÀsitlemisega seotud vigade riski.
SĂŒvenedes Temporal API-sse, Ă€rge unustage tutvuda ametliku dokumentatsiooniga ja katsetada erinevaid stsenaariume, et selle vĂ”imekust tĂ€ielikult mĂ”ista. Oma kaasaegse disaini ja laiaulatuslike funktsioonidega on Temporal valmis revolutsiooniliselt muutma viisi, kuidas me JavaScriptis kuupĂ€evi, kellaaegu ja kestusi kĂ€sitleme.